#ifndef DASHBOARD_H
#define DASHBOARD_H

#include <QWidget>
#include <QPainter>
#include <QTimer>


namespace Hydra_DashBoard_STYLE {

typedef enum _dasboard_style
{
    DEFAULT,
    CUSTOMER,
    STANDARD
}DASHBOARD_STYLE;
}

namespace Hydra_DashBoard_Rederhind {


// 抗锯齿等级
typedef enum _render_hint_lvl
{
    NONE,
    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    DEFAULT
}RENDER_HINT_LVL;
}

namespace Hydra_Dashboard_Ref_Pointer {

typedef enum _ref_pointer_type
{
    DEFAULT,
    ONE,
    TWO
}REF_POINTER_TYPE;

}

namespace Hydra_Dashboard_Cur_Pointer {

typedef enum _cur_pointer_type
{
    DEFAULT,
    ONE,
    TWO
}CUR_POINTER_TYPE;
}

namespace Hydra_DashBoard_Scale {

typedef enum _scale_type
{
    DEFAULT,
    ONE,
    TWO
}SCALE_TYPE;
}



// Pi
#define Pi (3.14159)

#define DEFAULT_FONT "Arial"



using namespace Hydra_DashBoard_STYLE;
using namespace Hydra_DashBoard_Rederhind;
using namespace Hydra_Dashboard_Ref_Pointer;
using namespace Hydra_Dashboard_Cur_Pointer;
using namespace Hydra_DashBoard_Scale;

class DashBoard : public QWidget
{
    Q_OBJECT

public:
    DashBoard(QWidget *parent = 0);

    /* ---------------------------------------------------全局设置--------------------------------------------------- */
    void setArcScalesMaxSweep(quint16 value);                                                                   // 设置刻度圆弧最大跨度
    void setScalesNumber(quint8 value);                                                                         // 设置刻度格数
    void setEqualScaleValue(quint8 value);                                                                      // 设置平均刻度
    void setInterval(quint16 value);                                                                            // 设置刷新频率
    void paramInit();                                                                                           // 初始化属性
    void setRenderHintLevel(RENDER_HINT_LVL level);                                                             // 设置抗锯齿等级
//    void setBackgroundEnable(bool value);                                                                       // 设置是否显示方形背景色
    void setDashboardStyle(DASHBOARD_STYLE style);                                                              // 设置表盘样式

    /* ---------------------------------------------------属性设置--------------------------------------------------- */
    void setCircleOneBackgroundColor(QColor color);                                                             // 设置圆1的背景色
    void setCircleTwoLineColor(QColor color);                                                                   // 设置圆2的背景色
    void setCircleTwoLineWidth(quint8 width);                                                                   // 设置圆2的外轮廓线条宽度
    void setCircleTwoRadiusProportion(quint8 value);                                                            // 设置圆2的半径占比
    void setCircleThreeBackgroundColor(QColor color);                                                           // 设置圆3的背景色
    void setCircleThreeRadiusProportion(quint8 value);                                                          // 设置圆3的半径占比，详见m_CircleThreeRadiusProportion属性说明
    void setCircleFourRadiusProportion(quint8 value);                                                           // 设置圆4的半径占比，详见m_CircleFourRadiusProportion属性说明
    void setCircleFiveRadiusProportion(quint8 value);                                                           // 设置圆5的半径占比，详见m_CircleFiveRadiusProportion属性说明
    void setCircleFiveLineColor(QColor color);                                                                  // 设置圆5的背景色
    void setCircleFiveLineWidth(quint8 width);                                                                  // 设置圆5的外轮廓线条宽度
    void setCircleFiveBackgroundColor(QColor color);                                                            // 设置圆5的背景色
    void setArcScalePointsRadiusProportion(quint8 value);                                                       // 设置刻度圆点所在圆弧的半径占比，详见m_ArcScalePointsRadiusProportion属性说明
    void setScalePointBackgroundColor(QColor color);                                                            // 设置刻度圆点背景色
    void setScalePointRadiusProportion(quint8 value);                                                           // 设置刻度圆点半径占比
    void setArcScaleValuesRadiusProportion(quint8 value);                                                       // 设置刻度值所在圆弧半径占比，详见m_ArcScaleValuesRadiusProportion属性说明
    void setScaleValuesFontColor(QColor color);                                                                 // 设置刻度值的颜色
    void setScaleValuesFontSizeProportion(quint8 value);                                                        // 设置刻度值的字体大小占比，详见m_ScaleValuesFontSizeProportion属性说明
    void setScaleValuesFontFace(QString font);                                                                  // 设置刻度值的字体类型
    void setDigitalValueFontColor(QColor color);                                                                // 设置数字显示区域当前值的字体颜色
    void setDigitalValueFontSizeProportion(quint8 value);                                                       // 设置数字显示区域当前值的字体大小占比，详见m_DigitalValueFontSizeProportion属性说明
    void setDigitalValueFontFace(QString font);                                                                 // 设置数字显示区域当前值的字体类型
    void setDigitalValue(quint16 value);                                                                        // 设置数字显示区域显示数值
    void setUnitFontColor(QColor color);                                                                        // 设置数字显示区域显示单位的字体颜色
    void setUnitFontSizeProportion(quint8 value);                                                               // 设置数字显示区域显示单位的字体大小占比，详见m_UnitFontSizeProportion属性说明
    void setUnitDistToCenterProportion(quint16 value);                                                          // 设置数字显示区域显示单位中心点距离图形中心的距离占圆5半径比例，详见m_UnitDistToCenterProportion属性说明
    void setUnitFontFace(QString font);                                                                         // 设置数字显示区域显示单位的字体类型
    void setUnit(QString strUnit);                                                                              // 设置显示单位
    void setArcValueColor(QColor color);                                                                        // 设置当前值圆弧的颜色
    void setArcValueEnbale(bool value);                                                                         // 设置当前值弧形背景显示属性，true:显示当前值背景，false：隐藏当前值背景
    void setCurrentPointerColor(QColor color);                                                                  // 设置当前值指针颜色
    void setCurrentPointerBottomAngle(quint8 value);                                                            // 设置当前值指针2个底角与图形中心点的连线的夹角
    void setCurrentPointerDistToCircleFiveProportion(quint8 value);                                             // 设置当前值指针底边距离图形中心点的距离占圆5半径的比例，详见m_CurrentPointerDistToCircleFiveProportion属性说明
    void setCurrentPonterEnable(bool value);                                                                    // 设置当前值指针显示属性，true:显示指针， false：隐藏指针
    void setTargetPointerColor(QColor color);                                                                   // 设置目标值指针颜色
    void setTargetPonterEnable(bool value);                                                                     // 设置目标值指针显示属性，true:显示指针， false：隐藏指针
    void setTargetValue(quint16 value);                                                                         // 设置目标值
    void setAlarmPointerColor(QColor color);                                                                    // 设置报警阀值指针颜色
    void setAlarmPonterEnable(bool value);                                                                      // 设置报警阀值指针显示属性，true:显示指针， false：隐藏指针
    void setAlarmValue(quint16 value);                                                                          // 设置报警阀值
    void setEmergencyPointerColor(QColor color);                                                                // 设置紧急阀值指针颜色
    void setEmergencyPonterEnable(bool value);                                                                  // 设置紧急阀值指针显示属性，true:显示指针， false：隐藏指针
    void setEmergencyValue(quint16 value);                                                                      // 设置紧急阀值
    void setTriangleReferencePointerBottomAngle(quint8 value);                                                  // 设置参考值三角形指针两个底角顶点与图形中心点的夹角
    void setTriangleReferencePointerBottomDistToCircleFiveProportion(quint16 value);                            // 设置参考值三角形指针底边距离图形中心的距离占圆5的比例占圆5半径的比例，详见m_TriangleReferencePointerBottomDistToCircleFiveProportion属性说明
    void setTriangleReferencePointerTopDistToCircleFiveProportion(quint16 value);                               // 设置参考值三角形指针顶点距离图形中心的距离占圆5的比例占圆5半径的比例，详见m_TriangleReferencePointerTopDistToCircleFiveProportion属性说明
    //void setCurrentPointerType(CUR_POINTER_TYPE type);                                                          // 设置当前值指针类型
    void setReferencePointerType(REF_POINTER_TYPE type);                                                        // 设置参考值指针类型
    void setScaleType(SCALE_TYPE type);                                                                         // 设置刻度类型
    void setLargeScaleLineWidth(quint8 width);                                                                  // 设置大刻度线宽度
    void setSmallScaleLineWidth(quint8 width);                                                                  // 设置小刻度线宽度
    void setLargeScaleInsideCircleRadiusProportion(quint8 value);                                               // 设置大刻度线内圆半径占比
    void setSmallScaleInsideCircleRadiusProportion(quint8 value);                                               // 设置小刻度线内圆半径占比
    void setScaleValueRotateEnable(bool value);                                                                 // 设置刻度值旋转


private:
    /* ---------------------------------------------------图形绘制--------------------------------------------------- */
//    void drawBackground(QPainter* pPainter);                                                                    // 绘制控件背景色
    void drawDashBoard(QPainter* pPainter);                                                                     // 绘制表盘
    void drawCircleOne(QPainter* pPainter);                                                                     // 绘制圆1
    void drawCircleTwo(QPainter* pPainter);                                                                     // 绘制圆2
    void drawCircleThree(QPainter* pPainter);                                                                   // 绘制圆3
    void drawCircleFour(QPainter* pPainter);                                                                    // 绘制圆4
    void drawCircleFive(QPainter* pPainter);                                                                    // 绘制圆5
    void drawScalePoints(QPainter* pPainter);                                                                   // 绘制刻度圆点
    void drawScaleValues(QPainter* pPainter);                                                                   // 绘制刻度值
    void drawDigitalValue(QPainter* pPainter);                                                                  // 绘制数字显示区域的数值
    void drawUnit(QPainter* pPainter, QRect rect);                                                              // 绘制数字显示区域的显示单位
    void drawArcValue(QPainter* pPainter);                                                                      // 绘制当前值的弧形区域
    void drawCurrentPointer(QPainter* pPainter);                                                                // 绘制当前值指针
    void drawTargetPointer(QPainter* pPainter);                                                                 // 绘制目标值指针
    void drawAlarmPointer(QPainter* pPainter);                                                                  // 绘制报警值指针
    void drawEmergencyPointer(QPainter* pPainter);                                                              // 绘制紧急值指针



protected:
    /* ---------------------------------------------------通用函数--------------------------------------------------- */
    void drawTriangle(QPainter* pPainter, quint16 value, QColor color, quint16 angle, quint16 length, bool flag = false);       // 绘制三角形， flag(true: 绘制当前值指针，false：绘制参考值指针)
    void drawCircle(QPainter *pPainter, QColor color, QPoint center, quint16 radius);                           // 绘制圆形
    void drawReferencePointer(QPainter* pPainter, quint16 value, QColor color);                                 // 绘制参考值指针
    void initStandardStyle();
    void initCustomerSytle();                                                                                   // 自定义样式




public slots:
    void refresh();                                                                                             // 定期刷性


private:
    void paintEvent(QPaintEvent* e);






private:
    QTimer* pTimer;                                                                                             // 定期刷新时钟

    /* ---------------------------------------------------全局属性--------------------------------------------------- */
    RENDER_HINT_LVL m_RenderHintLevle = RENDER_HINT_LVL::DEFAULT;                                               // 抗锯齿等级
//    CUR_POINTER_TYPE m_CurrentPointerType = CUR_POINTER_TYPE::DEFAULT;                                        // 当前值指针形状
    SCALE_TYPE m_ScaleType = SCALE_TYPE::DEFAULT;                                                               // 刻度类型
    REF_POINTER_TYPE m_ReferencePointerType = REF_POINTER_TYPE::DEFAULT;                                        // 参考值指针形状
    quint16 m_ArcScalesMaxSweep = 270;                                                                          // 刻度所在弧线的最大弧度
    quint16 m_BaseAngle;                                                                                        // 刻度的起始角度
    quint8 m_ScalesNumber = 12;                                                                                 // 刻度格子数量，刻度数量 = 刻度格子数量 + 1
    quint8 m_EqualScaleValue = 10;                                                                              // 平均刻度值
    DASHBOARD_STYLE m_Dashboard_Style = DASHBOARD_STYLE::DEFAULT;                                               // 默认样式与CUSTOMER一致


    /* ---------------------------------------------------圆形相关属性--------------------------------------------------- */
    QPoint m_CenterPoint;                                                                                       // 控件中心点
    quint16 m_CircleOneRadius;                                                                                  // 圆1的半径
    quint8 m_CircleTwoRadiusProportion = 90;                                                                    // 圆2的半径占圆1半径的比例(需除以100得到百分比)
    quint16 m_CircleTwoRadius;                                                                                  // 圆2的半径
    quint8 m_CircleTwoLineWidth = 5;                                                                            // 圆2的外轮廓线条宽度
    quint8 m_CircleThreeRadiusProportion = 80;                                                                  // 圆3的半径占圆2半径的比例(需除以100得到百分比)
    quint16 m_CircleThreeRadius;                                                                                // 圆3的半径
    quint8 m_CircleFourRadiusProportion = 40;                                                                   // 圆4的半径占圆2半径的比例(需除以100得到百分比)
    quint16 m_CircleFourRadius;                                                                                 // 圆4的半径
    quint8 m_CircleFiveRadiusProportion = 35;                                                                   // 圆5的半径占圆2半径的比例(需除以100得到百分比)
    quint8 m_CircleFiveLineWidth = 5;                                                                           // 圆5的外轮廓线条宽度
    quint16 m_CircleFiveRadius;                                                                                 // 圆5的半径
    quint8 m_ArcScalePointsRadiusProportion = 95;                                                               // 刻度圆点所在圆弧半径占圆形2和圆3半径差的比例(需除以100得到百分比)
    quint16 m_ArcScalePointsRadius;                                                                             // 刻度圆点所在圆弧半径
    quint8 m_ScalePointRadius;                                                                                  // 刻度圆点的半径
    quint8 m_ScalePointRadiusProportion = 10;                                                                   // 刻度圆点的半径占圆形2和圆3半径差的比例(需除以100得到百分比)
    quint8 m_ArcScaleValuesRadiusProportion = 85;                                                               // 刻度值所在圆弧半径占圆形2半径的比例(需除以100得到百分比)
    quint16 m_ArcScaleValuesRadius;                                                                             // 刻度值所在圆弧的半径
    quint8 m_ScaleValuesFontSize;                                                                               // 刻度值的字体大小
    quint8 m_ScaleValuesFontSizeProportion = 30;                                                                // 刻度值的字体大小占圆形5半径的比例(需除以100得到百分比)
    QString m_ScaleValuesFontFace = DEFAULT_FONT;                                                               // 刻度值的字体类型
    quint8 m_DigitalValueFontSize;                                                                              // 数字显示区域当前值的字体大小
    quint8 m_DigitalValueFontSizeProportion = 90;                                                               // 数字显示区域当前值的字体大小占圆形5半径的比例(需除以100得到百分比)
    QString m_DigitalValueFontFace = DEFAULT_FONT;                                                              // 数字显示区域当前值的字体类型
    quint8 m_UnitFontSize;                                                                                      // 数字显示区域显示单位的字体大小
    quint8 m_UnitFontSizeProportion = 40;                                                                       // 数字显示区域显示单位的字体大小占圆形5半径的比例(需除以100得到百分比)
    quint16 m_UnitDistToCenterProportion = 230;                                                                 // 数字显示区域显示单位中心点距离图形中心的距离占圆5半径比例(需除以100得到百分比)
    QString m_UnitFontFace = DEFAULT_FONT;                                                                      // 数字显示区域显示单位的字体类型
    QString m_Unit = "km/h";                                                                                    // 数字显示区域显示单位
    quint8 m_CurrentPointerBottomAngle = 16;                                                                    // 当前值指针三角形两个底角与图形中心连线的夹角
    quint8 m_CurrentPointerDistToCircleFiveProportion = 100;                                                    // 当前值指针三角形高度占圆5半径的比例(需除以100得到百分比)
    quint16 m_DigitalValue = 0;                                                                                 // 数字显示区域的当前值
    quint16 m_TargetValue = 0;                                                                                  // 目标值
    quint16 m_AlarmValue = 0;                                                                                   // 告警阀值
    quint16 m_EmergencyValue = 0;                                                                               // 紧急阀值
    quint8 m_TriangleReferencePointerBottomAngle = 4;                                                           // 参考值指针三角形两个底角与图形中心连线的夹角
    quint16 m_TriangleReferencePointerBottomDistToCircleFiveProportion = 292;                                   // 参考值指针三角形底边距离图形中心的距离占圆5半径的比例(需除以100得到百分比)
    quint16 m_TriangleReferencePointerTopDistToCircleFiveProportion = 300;                                      // 参考值指针三角形顶点距离图形中心的距离占圆5半径的比例(需除以100得到百分比)
    quint8 m_LargeScaleInsideCircleRadiusProportion = 86;                                                       // 大刻度线靠近图形中心侧的点所在圆半径占圆2半径的比例(需除以100得到百分比)
    quint8 m_SmallScaleInsideCircleRadiusProportion = 93;                                                       // 小刻度线靠近图形中心侧的点所在圆占圆2半径的比例(需除以100得到百分比)
    quint8 m_LargeScaleLineWidth = 3;                                                                           // 大刻度线宽度
    quint8 m_SmallScaleLineWidth = 2;                                                                           // 小刻度线宽度

    /* ---------------------------------------------------颜色属性--------------------------------------------------- */
    QColor m_CircleOneBackgroundColor = QColor(30, 12, 25);                                                     // 圆形1的背景色
    QColor m_CircleTwoLineColor = QColor(255, 255, 255);                                                        // 圆形2的轮廓线条颜色,改为圆弧
    QColor m_CircleThreeBackgroundColor = QColor(30, 20, 20);                                                   // 圆形3的背景色
    QColor m_CircleFiveLineColor = QColor(255, 255, 255);                                                       // 圆形5的轮廓线条颜色
    QColor m_CircleFiveBackgroundColor = QColor(50, 50, 50);                                                    // 圆形5的背景色
    QColor m_ScalePointBackgroundColor = QColor(212, 212, 212);                                                 // 刻度圆点背景色
    QColor m_ScaleValueFontColor = QColor(212, 212, 212);                                                       // 刻度值字体颜色
    QColor m_DigitalValueFontColor = QColor(255, 255, 255);                                                     // 数字显示区域当前值的字体颜色
    QColor m_UnitFontColor = QColor(255, 255, 255);                                                             // 数字显示区域显示单位的字体颜色
    QColor m_ArcValueColor = QColor(87, 161, 188);                                                              // 当前值所在圆弧填充的背景色
    QColor m_CurrentPointerColor = QColor(255, 255, 255);                                                       // 当前值指针颜色
    QColor m_TargetPointerColor = QColor(0, 255, 0);                                                            // 目标值指针颜色
    QColor m_AlarmPointerColor = QColor(255, 255, 0);                                                           // 报警阀值指针颜色
    QColor m_EmergencyPointerColor = QColor(255, 0, 0);                                                         // 紧急阀值指针颜色


    /* ---------------------------------------------------显示属性--------------------------------------------------- */
    bool m_CurrentPointerEnable = true;                                                                         // 当前值指针显示属性，true:显示， false：隐藏
    bool m_TargetPointerEnable = false;                                                                         // 目标值指针显示属性，true:显示， false：隐藏
    bool m_AlarmPointerEnable = true;                                                                           // 报警阀值指针显示属性，true:显示， false：隐藏
    bool m_EmergencyPointerEnable = true;                                                                       // 紧急阀值指针显示属性，true:显示， false：隐藏
    bool m_ArcValueEnable = true;                                                                               // 当前值弧形背景显示属性，true:显示，false：隐藏
    bool m_BackgroundEnable = true;                                                                             // 控件方形背景色显示属性，true:显示，false：隐藏
    bool m_ScaleValueRotateEnable = true;                                                                       // 刻度值旋转
};

#endif // DASHBOARD_H
